home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
PROGRAM
/
DJLGR106.ARJ
/
MOUSE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-29
|
4KB
|
170 lines
/* This is file MOUSE.C */
/*
** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
**
** This file is distributed under the terms listed in the document
** "copying.dj", available from DJ Delorie at the address above.
** A copy of "copying.dj" should accompany this file; if not, a copy
** should be available from where this file was obtained. This file
** may not be distributed without a verbatim copy of "copying.dj".
**
** This file is distributed WITHOUT ANY WARRANTY; without even the implied
** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
#include <stdio.h>
#include "mouse.h"
#include "sys/registers.h"
#include "ptr16.h"
static int mouse_initted = 0;
static MouseEvent last_event;
static unsigned char old_pixels[ptr16_height*ptr16_width];
static int lastx, lasty;
static mouse_fg, mouse_bg;
void MouseSetColors(int fg, int bg)
{
mouse_fg = fg;
mouse_bg = bg;
}
static paint_mouse(x, y)
{
int dx, dy, o;
for (dx=0; dx<ptr16_width; dx++)
for (dy=0; dy<ptr16_height; dy++)
{
o = dx + dy * ptr16_width;
switch (ptr16_data[o])
{
case 1:
old_pixels[o] = GrPixel(x+dx, y+dy);
GrPlot(x+dx, y+dy, mouse_bg);
break;
case 2:
old_pixels[o] = GrPixel(x+dx, y+dy);
GrPlot(x+dx, y+dy, mouse_fg);
break;
}
}
}
static unpaint_mouse()
{
int dx, dy, o;
for (dx=0; dx<ptr16_width; dx++)
for (dy=0; dy<ptr16_height; dy++)
{
o = dx + dy * ptr16_width;
if (ptr16_data[o])
GrPlot(lastx+dx, lasty+dy, old_pixels[o]);
}
}
void MouseSetSpeed(int speed)
{
REGISTERS r;
r.ax = 15;
r.cx = speed;
r.dx = speed;
int33(&r);
}
void MouseWarp(int x, int y)
{
REGISTERS r;
r.ax = 4;
r.cx = last_event.x = x;
r.dx = last_event.y = y;
int33(&r);
}
void MouseGetEvent(int flags, MouseEvent *e)
{
REGISTERS r;
if (!mouse_initted)
{
mouse_initted = 1;
r.ax = 0;
int33(&r);
r.ax = 7;
r.cx = 0;
r.dx = GrMaxX();
int33(&r);
r.ax = 8;
r.cx = 0;
r.dx = GrMaxY();
int33(&r);
MouseWarp(GrMaxX()/2, GrMaxY()/2);
r.ax = 3;
int33(&r);
last_event.x = r.cx;
last_event.y = r.dx;
last_event.buttons = r.bx & 7;
MouseSetSpeed(8);
MouseSetColors(GrWhite(), GrBlack());
}
if (!(flags & M_NOPAINT))
paint_mouse(last_event.x, last_event.y);
lastx = last_event.x;
lasty = last_event.y;
e->flags = 0;
while (1)
{
r.ax = 3;
int33(&r);
e->buttons = r.bx & 7;
r.ax = 11;
int33(&r);
e->x = lastx + (short)r.cx;
e->y = lasty + (short)r.dx;
if (e->x < 0) e->x = 0;
if (e->x > GrMaxX()) e->x = GrMaxX();
if (e->y < 0) e->y = 0;
if (e->y > GrMaxY()) e->y = GrMaxY();
if (flags & M_KEYPRESS)
if (kbhit())
{
e->key = getkey();
e->flags |= M_KEYPRESS;
}
if ((e->x != lastx) || (e->y != lasty))
{
if (!(flags & M_NOPAINT))
{
unpaint_mouse();
paint_mouse(e->x, e->y);
lastx = e->x;
lasty = e->y;
}
e->flags |= M_MOTION;
}
if (e->buttons != last_event.buttons)
{
int up = (~e->buttons & last_event.buttons);
int down = (e->buttons & ~last_event.buttons);
if (up & M_LEFT)
e->flags |= M_LEFT_UP;
if (up & M_MIDDLE)
e->flags |= M_MIDDLE_UP;
if (up & M_RIGHT)
e->flags |= M_RIGHT_UP;
if (down & M_LEFT)
e->flags |= M_LEFT_DOWN;
if (down & M_MIDDLE)
e->flags |= M_MIDDLE_DOWN;
if (down & M_RIGHT)
e->flags |= M_RIGHT_DOWN;
}
e->flags |= (flags & M_POLL);
if (e->flags & flags)
break;
}
e->flags &= flags;
last_event = *e;
last_event.flags &= ~M_KEYPRESS;
if (!(flags & M_NOPAINT))
unpaint_mouse();
}